import java.util.Set;

public class AplicacaoImpl implements Aplicacao {

	private Jogo jogo = new JogoGuerra30Anos();
	private Ica ica;

	public AplicacaoImpl(Ica ica) {
		this.ica = ica;
	}

	@Override
	public void enviarHipotese(String armaNome, String personagemNome, String paisNome) {
		jogo.formularHipotese(armaNome, personagemNome, paisNome);

		ica.atualizarSituacaoTodosJogadores(jogo.obterSituacao().name());

		Hipotese hipotese = jogo.obterHipotese();

		jogo.determinarRefutadores();

		jogo.distribuirHipotese(hipotese);

		ica.mostrarHipoteseParaTodoJogadores(hipotese.mostrarArma(), hipotese.mostrarSuspeito(), hipotese.mostrarPais());
		ica.mostrarParaTodosJogadores("Hipotese divulgada a todos os jogadores");
	}

	@Override
	public void listarOpcoes() {
		ConjuntoInformacao armas = jogo.obterArmasDisponiveis();
		Set<String> armasValores = armas.obterValores();
		ConjuntoInformacao personagens = jogo.obterPersonagensDisponiveis();
		Set<String> personagensValores = personagens.obterValores();
		ConjuntoInformacao paises = jogo.obterPaisesDisponiveis();
		Set<String> paisesValores = paises.obterValores();

		ica.mostrarInformacoesDisponiveisHipotese(jogo.obterJogadorCorrente(), armasValores, personagensValores, paisesValores);
	}

	@Override
	public void prepararRefutacao() {
		boolean existeRefutador = jogo.existeRefutador();
		Jogador refutadorDaVez = null;
		ConjuntoInformacao evidencias;

		if (existeRefutador) {
			refutadorDaVez = jogo.obterRefutadorDaVez();
			evidencias = refutadorDaVez.obterEvidenciasParaRefutacao();

			ica.mostrarEvidenciasParaRefutador(refutadorDaVez, evidencias);
		}
	}

	@Override
	public void refutarHipotese(Informacao evidencia) {
		jogo.aplicarRefutacao(evidencia);

		boolean hipoteseRefutada = jogo.hipoteseRefutada();
		if (hipoteseRefutada) {
			ica.mostrarHipoteseRefutada(jogo.obterJogadorCorrente(), jogo.obterJogadorCorrente().obterHipotese().evidenciaDaRefutacao().retornaValor());
			ica.mostrarHipoteseRefutadaParaTodos();
		} else {
			ica.mostrarPassandoParaProximoRefutador();
		}
	}

}
